跳到主要内容

Course

讲义

References

Project 1

LRU-K

是否应该记录时间戳?

感觉这个 LRU-K 的实现不太对。因为 LRU-K 优先驱逐的是倒数第 K 个最远的,所以即使在 Cache 里面,再次访问也不一定会把记录提升到队头。 举个例子: 假如 K=3 已经插入了 1 1 1 2 2 2 如果再插入一次 1,按照 up 的方法会把 1 放在 cache_list 的队头,下次会优先驱逐 2 但是插入后的队列 1 1 1 2 2 2 1 按照倒数第 K 次出现的位置,2 的时间戳还是比 1 晚的,所以应该驱逐 1。就出现了问题(欢迎讨论)

【CMU15-445/645】可扩展哈希与 LRU-K(代码篇)_哔哩哔哩_bilibili

Buffer Pool

传统 LRU

class LRUCache {
public:
LRUCache(int capacity) : cap(capacity) {
}

int get(int key) {
if (map.find(key) == map.end()) return -1;
auto key_value = *map[key];
cache.erase(map[key]);
cache.push_front(key_value);
map[key] = cache.begin();
return key_value.second;
}

void put(int key, int value) {
if (map.find(key) == map.end()) {
if (cache.size() == cap) {
map.erase(cache.back().first);
cache.pop_back();
}
}
else {
cache.erase(map[key]);
}
cache.push_front({key, value});
map[key] = cache.begin();
}
private:
int cap;
list<pair<int, int>> cache;
unordered_map<int, list<pair<int, int>>::iterator> map;
};

C++

1. 构造函数问题

优化